package com.eva.core.constants;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.*;

/**
 * 框架级常量
 * @author Eva.Caesar Liu
 * @date 2022-03-01 00:00
 */
public interface Constants {

    /**
     * 缓存Key
     */
    interface CacheKey {
        String INTERFACE_CONFIG_LIST = "INTERFACE_CONFIG_LIST";
    }

    /**
     * 操作类型，用于做接口验证分组
     */
    interface OperaType {

        /**
         * 创建
         * @author Eva.Caesar Liu
         * @date 2022/02/19 18:03
         */
        interface Create {}

        /**
         * 修改
         * @author Eva.Caesar Liu
         * @date 2022/02/19 18:03
         */
        interface Update {}

        /**
         * 修改状态
         * @author Eva.Caesar Liu
         * @date 2022/02/19 18:03
         */
        interface UpdateStatus {}
    }

    /**
     * 数据权限
     */
    interface DataPermission {

        /**
         * 数据权限模块
         */
        @Getter
        @AllArgsConstructor
        enum Module {
            DEPARTMENT("DEPARTMENT", "部门管理"),
            POSITION("POSITION", "岗位管理"),
            ;
            private String businessCode;

            private String moduleName;

            public static List<Map<String, Object>> valueList () {
                List<Map<String, Object>> list = new ArrayList<>();
                for (Module module: Module.values()) {
                    list.add(new HashMap<String, Object>(){{
                        this.put("businessCode", module.getBusinessCode());
                        this.put("moduleName", module.getModuleName());
                    }});
                }
                return list;
            }
        }

        /**
         * 数据权限类型
         */
        @Getter
        @AllArgsConstructor
        enum Type {
            ALL((short)0,"全部", new Module[]{}),
            DEPARTMENT_CUSTOM((short)11, "自定义部门", new Module[]{Module.DEPARTMENT}),
            DEPARTMENT_CHILDREN((short)12, "所属部门及其子孙部门", new Module[]{Module.DEPARTMENT}),
            DEPARTMENT_CHILD((short)13, "所属部门及其子部门", new Module[]{Module.DEPARTMENT}),
            DEPARTMENT((short)14, "仅所属部门", new Module[]{Module.DEPARTMENT}),
            POSITION_CUSTOM((short)21, "自定义岗位", new Module[]{Module.POSITION}),
            POSITION_CHILDREN((short)22, "所属岗位及其子孙岗位", new Module[]{Module.POSITION}),
            POSITION_CHILD((short)23, "所属岗位及其子岗位", new Module[]{Module.POSITION}),
            POSITION((short)24, "仅所属岗位", new Module[]{Module.POSITION}),
            ;

            // 类型编码
            private short code;

            // 类型备注
            private String remark;

            // 所属模块，为空时表示所有模块可用
            private Module[] modules;

            public static List<Map<String, Object>> valueList () {
                List<Map<String, Object>> list = new ArrayList<>();
                for (Type type: Type.values()) {
                    List<String> modules = new ArrayList<>();
                    for (Module module : type.getModules()) {
                        modules.add(module.getBusinessCode());
                    }
                    list.add(new HashMap<String, Object>(){{
                        this.put("code", type.getCode());
                        this.put("remark", type.getRemark());
                        this.put("modules", modules);
                    }});
                }
                return list;
            }
        }
    }

    /**
     * Job常量
     */
    interface Job {

        // jobId在JOB实例中的存储参数键
        String JOB_DATA_MAP_JOB_ID = "JOB_ID";

        /**
         * JOB状态
         */
        @Getter
        @AllArgsConstructor
        enum JobStatus {
            PAUSE((byte) -1, "暂停"),
            READY((byte) 0, "已准备"),
            RUNNING((byte) 1, "运行中"),
            ;
            private byte code;
            private String remark;
        }

        /**
         * 分片状态
         */
        @Getter
        @AllArgsConstructor
        enum SnippetStatus {
            READY((byte) 0, "已准备"),
            RUNNING((byte) 1, "运行中"),
            SUCCESS((byte) 2, "执行成功"),
            FAILED((byte) -2, "执行失败"),
            ;
            private byte code;
            private String remark;
        }

        /**
         * 分片状态
         */
        @Getter
        @AllArgsConstructor
        enum LogStatus {
            FAILED((byte) 0, "执行失败"),
            SUCCESS((byte) 1, "执行成功"),
            IGNORE((byte) 2, "跳过"),
            NONE((byte) -1, "未得到处理"),
            ;
            private byte code;
            private String remark;
        }

        /**
         * 触发类型
         */
        @Getter
        @AllArgsConstructor
        enum TriggerType {
            SYSTEM("SYSTEM", "系统"),
            MANUAL("MANUAL", "手动"),
            ;
            private String code;
            private String remark;
        }
    }

    /**
     * 跟踪日志异常等级
     */
    @Getter
    @AllArgsConstructor
    enum ExceptionLevel {
        DANGER((byte)10, "高"),
        WARN((byte)5, "中"),
        LOW((byte)0, "低"),
        ;

        private byte level;

        private String remark;
    }

    /**
     * MyBatis自动注入忽略
     */
    interface Ignore {
        /**
         * 忽略时间，当不需要更新createTime/updateTime时，可使用该常量进行填充。
         */
        Date IGNORE_TIME = new IgnoreDate();

        /**
         * 忽略用户，当不需要更新createUser/updateUser时，可使用该常量进行填充。
         */
        Integer IGNORE_USER = -1;

        /**
         * 忽略时间类
         */
        class IgnoreDate extends Date {}
    }
}
